/*
 * SPDX-FileCopyrightText: 2022 Andrew Gunnerson
 * SPDX-License-Identifier: GPL-3.0-only
 */

package com.sanji.audio_test.format

import android.media.MediaFormat
import java.nio.ByteBuffer

/**
 * 音频编码器抽象类
 * 
 * 该类定义了音频编码器的基本接口和通用功能，处理音频帧的编码过程
 * 
 * @param mediaFormat 包含音频格式信息的 MediaFormat 对象
 */
abstract class Encoder(
    mediaFormat: MediaFormat,
) {
    /** 每帧的字节大小 */
    protected val frameSize = mediaFormat.getInteger(Format.KEY_X_FRAME_SIZE_IN_BYTES)
    
    /** 音频采样率 */
    private val sampleRate = mediaFormat.getInteger(MediaFormat.KEY_SAMPLE_RATE)

    /** 至今已编码的帧数 */
    protected var numFrames = 0L

    /** 基于已编码帧数的显示时间戳（微秒） */
    protected val timestampUs
        get() = numFrames * 1_000_000L / sampleRate

    /**
     * 启动编码器进程
     *
     * 仅在编码器进程尚未启动时可以调用
     */
    abstract fun start()

    /**
     * 停止编码器进程
     *
     * 仅在编码器进程已启动时可以调用
     */
    abstract fun stop()

    /**
     * 释放编码器进程使用的资源
     *
     * 如果编码器进程尚未停止，则会先停止它
     */
    abstract fun release()

    /**
     * 提交缓冲区进行编码
     *
     * @param buffer 必须是编码器期望的 PCM 格式，且 [ByteBuffer.position] 和 
     * [ByteBuffer.limit] 必须正确表示数据的边界
     * @param isEof 设置为 true 后不能再提交更多数据
     */
    abstract fun encode(buffer: ByteBuffer, isEof: Boolean)
}